package edu.cuit.avatar.p1;

/**
 * @author <a href="mailto:1020zhaodan@163.com">Adan</a>
 * @version 1.0
 * @date 2025/7/4 10:34
 */
public class Student {
    //学生唯一标识
    private int id;
    /**
     * 静态变量:存储在公共的内存空间中，被所有的对象共享
     */
    private static int nextId = 1;

    private String name; //null

    private int age; //0

    private boolean isScienceMajor; //false

    private char gender; // '\u0000'

    static{
        System.out.println("静态代码块:随着类的加载而加载执行，只执行一次。一般用于环境的初始化");
    }

//    {
//        System.out.println("实例代码块:在构造方法前被调用，作用完成对象实例初始化,功能与构造方法重叠，建议使用构造方法完成初始化");
//    }

    public Student(){
        this.id = nextId++;
    }

    public Student(String name, int age, boolean isScienceMajor, char gender) {
        //在构造方法中调用同一类的其它的构造方法
        this(); //只能出现在构造方法的第一条语句
        this.name = name;
        this.age = age;
        this.isScienceMajor = isScienceMajor;
        this.gender = gender;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public boolean isScienceMajor() {
        return isScienceMajor;
    }

    public void setScienceMajor(boolean scienceMajor) {
        isScienceMajor = scienceMajor;
    }

    public char getGender() {
        return gender;
    }

    public void setGender(char gender) {
        this.gender = gender;
    }

    public void show(){
        System.out.printf("id:%d, name:%s, age:%d, is science major:%5b, gender:%c\r\n", id, name, age, isScienceMajor, gender);
    }

    /**
     * 静态方法: 静态方法是不在对象上执行的方法
     * 只能访问静态成员的(不能访问非静态的)
     * 在下面两种情况下可以使用静态方法:
     *      方法不需要访问对象状态，因为它需要的所有参数都通过显式参数提供（例如:Math.pow)。
     *      方法只需要访问类的静态字段
     * @return nextId
     */
    public static int getNextId(){
        return nextId;
    }
}
